﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Inventarios
{
    public class dbo_Fact_Existencias
    {
        
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public dbo_Fact_Existencias(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion
        
        #region INSERT

        public Respuesta Insert_Fact_Existencias(
            string Id_Almacen, 
            string Id_Articulo,
            string Cantidad
        )
        {
            try
            {
                string Query = @"INSERT INTO dbo_Fact_Existencias
                             (
                                Id_Existencia,
                                RFC,
                                Id_Almacen,
                                Id_Articulo,                                                                
                                Cantidad,
                                Fecha_Mantto,
                                Usuario_Mantto
                             )
                             VALUES
                             (
                                IIF(DCount('*', 'dbo_Fact_Existencias') = 0, 1, DMax('Id_Existencia', 'dbo_Fact_Existencias') + 1),
                                '@@RFC',
                                '@@Id_Almacen',
                                '@@Id_Articulo',                                
                                @@Cantidad,
                                NOW(),
                                '@@Usuario_Mantto'
                             )";

                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Id_Almacen", Id_Almacen);
                Query = Query.Replace("@@Id_Articulo", Id_Articulo);                
                Query = Query.Replace("@@Cantidad", Cantidad);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }            
        }

        #endregion

        #region UPDATE

        public Respuesta Update_Fact_Existencias(
            string Id_Almacen, 
            string Id_Articulo,
            string Cantidad)
        {
            try
            {
                string Query_C = "SELECT * FROM dbo_Fact_Existencias WHERE Id_Almacen = @@IdAlmacen AND Id_Articulo = @@IdArticulo";
                Query_C = Query_C.Replace("@@IdAlmacen", Id_Almacen);
                Query_C = Query_C.Replace("@@IdArticulo", Id_Articulo);

                if (SrvDB.ExecuteQuery_Get(Query_C).Rows.Count > 0)
                {

                    string Query = @"UPDATE dbo_Fact_Existencias SET
                                             
                                    Cantidad = @@Cantidad,
                                    Fecha_Mantto = NOW(),
                                    Usuario_Mantto = '@@Usuario_Mantto'

                                 WHERE Id_Almacen = @@IdAlmacen AND Id_Articulo = @@IdArticulo AND RFC = '@@RFC'";

                    Query = Query.Replace("@@Cantidad", Cantidad);
                    Query = Query.Replace("@@IdAlmacen", Id_Almacen);
                    Query = Query.Replace("@@IdArticulo", Id_Articulo);
                    Query = Query.Replace("@@Usuario_Mantto", this._Usuario);
                    Query = Query.Replace("@@RFC", this._RFC);
                    Query = Query.Replace("@@IdArticulo", Id_Articulo);

                    return SrvDB.ExecuteQuery_Update(Query);
                }
                else
                {
                    return Insert_Fact_Existencias(Id_Almacen, Id_Articulo, Cantidad);
                }
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        
        #endregion

        #region DELETE
        /*
        public Respuesta Delete_UM_Por_Id(
            object Id
        )
        {
            try
            {
                string Query = @"DELETE FROM dbo_Cat_UM 
                                    WHERE Id_UM = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());

                return SrvDB.ExecuteQuery_Delete(Query);
                
                
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        */
        #endregion

        #region SELECT

        public DataTable Get_InventarioExcedente()
        {
            string Query = @"

                Select 

                    a.RFC,
                    a.Id_Articulo, a.Clave, a.Nombre,
                    a.NombreTicket, b.CantidadSum,
                    a.Stock_Minimo, a.Stock_Maximo,
                    b.CantidadSum - a.Stock_Maximo as Diferencia,
                    c.Nombre as UM

                From
                    ((dbo_Cat_Articulo a 

                    INNER JOIN (SELECT Id_Articulo, Sum(Cantidad) AS CantidadSum FROM dbo_Fact_Existencias WHERE RFC = '@@RFC' GROUP BY Id_Articulo) AS b ON a.Id_Articulo = b.Id_Articulo )

                    INNER JOIN dbo_Cat_UM AS c ON a.Id_UM = c.Id_UM)

                    WHERE b.CantidadSum > a.Stock_Maximo AND A.RFC = '@@RFC'
            ";

            Query = Query.Replace("@@RFC", this._RFC);            

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_InventarioFaltante()
        {
            string Query = @"

                Select 

                    a.RFC,
                    a.Id_Articulo, a.Clave, a.Nombre,
                    a.NombreTicket, b.CantidadSum,
                    a.Stock_Minimo, a.Stock_Maximo,
                    a.Stock_Minimo - b.CantidadSum as Diferencia,
                    c.Nombre as UM

                From
                    ((dbo_Cat_Articulo a 

                    INNER JOIN (SELECT Id_Articulo, Sum(Cantidad) AS CantidadSum FROM dbo_Fact_Existencias WHERE RFC = '@@RFC' GROUP BY Id_Articulo) AS b ON a.Id_Articulo = b.Id_Articulo )

                    INNER JOIN dbo_Cat_UM AS c ON a.Id_UM = c.Id_UM)

                    WHERE b.CantidadSum < a.Stock_Minimo AND A.RFC = '@@RFC'
            ";

            Query = Query.Replace("@@RFC", this._RFC);            

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Report(int CriterioGrupo, int Valor, int Id_Articulo, int Id_Almacen, int Id_Grupo, int Id_Subgrupo, int Id_Linea , int Id_Talla, int Id_Color, string Top)
        {
            string Query = @"

                SELECT        

					Switch(
						@CriterioGrupo = 1, dbo_Cat_Articulo.NombreTicket, 
						@CriterioGrupo = 2, dbo_Cat_Almacen.Descripcion, 
						@CriterioGrupo = 3, Switch(dbo_Cat_Articulo.Marca IS NULL, 'Sin Marca', true, dbo_Cat_Articulo.Marca),
						@CriterioGrupo = 4, dbo_Cat_Grupo_Productos.Nombre,
						@CriterioGrupo = 5, dbo_Cat_Subgrupo_Productos.Nombre,
						@CriterioGrupo = 6, dbo_Cat_Linea.Nombre,
						@CriterioGrupo = 7, dbo_Cat_Talla.Nombre,
						@CriterioGrupo = 8, dbo_Cat_Color.Nombre
						
                    ) AS Grupo, 			  

                    SUM(
						Switch(						
							@Valor = 1 , Cantidad,	
							@Valor = 2 , Costo_Pref,	
							@Valor = 3 , Costo_Promedio,	
							@Valor = 4 , Costo_Std,	
							@Valor = 5 , Costo_Ultimo,								
						) 
					) AS Valor

                From 

	                (((((((((dbo_Fact_Existencias 
	                INNER JOIN dbo_Cat_Articulo ON dbo_Fact_Existencias.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Tipo_Articulo ON dbo_Cat_Articulo.Tipo_Articulo = dbo_Cat_Tipo_Articulo.Tipo_Articulo )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Almacen ON dbo_Fact_Existencias.Id_Almacen = dbo_Cat_Almacen.Id_Almacen )
	                INNER JOIN dbo_Cat_UM ON dbo_Cat_Articulo.Id_UM = dbo_Cat_UM.Id_UM )
	                LEFT OUTER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                LEFT OUTER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                LEFT OUTER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )

	            Where 

                    dbo_Cat_Articulo.RFC = '@RFC' and
                    (@Id_Articulo = -1 or @Id_Articulo = dbo_Cat_Articulo.Id_Articulo) and
                    (@Id_Almacen = -1 or @Id_Almacen = dbo_Fact_Existencias.Id_Almacen ) and
                    (@Id_Grupo = -1 or @Id_Grupo = dbo_Cat_Articulo.Id_GrupoProductos) and
                    (@Id_Subgrupo = -1 or @Id_Subgrupo = dbo_Cat_Articulo.Id_SubgrupoProductos) and
                    (@Id_Linea = -1 or @Id_Linea = dbo_Cat_Articulo.Id_Linea) and
                    (@Id_Talla = -1 or @Id_Talla = dbo_Cat_Articulo.Id_Talla) and
                    (@Id_Color = -1 or @Id_Color = dbo_Cat_Articulo.Id_Color)

                Group by

                Switch(
	                @CriterioGrupo = 1, dbo_Cat_Articulo.NombreTicket, 
	                @CriterioGrupo = 2, dbo_Cat_Almacen.Descripcion, 
	                @CriterioGrupo = 3, Switch(dbo_Cat_Articulo.Marca IS NULL, 'Sin Marca', true, dbo_Cat_Articulo.Marca),
	                @CriterioGrupo = 4, dbo_Cat_Grupo_Productos.Nombre,
	                @CriterioGrupo = 5, dbo_Cat_Subgrupo_Productos.Nombre,
	                @CriterioGrupo = 6, dbo_Cat_Linea.Nombre,
	                @CriterioGrupo = 7, dbo_Cat_Talla.Nombre,
	                @CriterioGrupo = 8, dbo_Cat_Color.Nombre
						
                ) 

                Order by

	                SUM(
		                Switch(						
			                @Valor = 1 , Cantidad,
			                @Valor = 2 , Costo_Pref,	
			                @Valor = 3 , Costo_Promedio,	
			                @Valor = 4 , Costo_Std,	
			                @Valor = 5 , Costo_Ultimo								
		                ) 
	                ) 

                @Top

            ";
            
            Query = Query.Replace("@RFC", this._RFC);
            Query = Query.Replace("@CriterioGrupo", CriterioGrupo.ToString());
            Query = Query.Replace("@Valor", Valor.ToString());
            Query = Query.Replace("@Id_Articulo", Id_Articulo.ToString());
            Query = Query.Replace("@Id_Almacen", Id_Almacen.ToString());
            Query = Query.Replace("@Id_Grupo", Id_Grupo.ToString());
            Query = Query.Replace("@Id_Subgrupo", Id_Subgrupo.ToString());
            Query = Query.Replace("@Id_Linea", Id_Linea.ToString());
            Query = Query.Replace("@Id_Talla", Id_Talla.ToString());
            Query = Query.Replace("@Id_Color", Id_Color.ToString());
            Query = Query.Replace("@Top", Top.Equals("Top") ? "Desc" : "Asc");

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Fact_Existencias_Por_Ids(string IdAlmacen, string IdArticulo)
        {
            string Query = "SELECT * FROM dbo_Fact_Existencias WHERE Id_Almacen = @@IdAlmacen AND Id_Articulo = @@IdArticulo";
            Query = Query.Replace("@@IdAlmacen", IdAlmacen);
            Query = Query.Replace("@@IdArticulo", IdArticulo);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public int Get_Existencia_Por_Id(string IdAlmacen, string IdArticulo)
        {
            string Query = "SELECT * FROM dbo_Fact_Existencias WHERE Id_Almacen = @@IdAlmacen AND Id_Articulo = @@IdArticulo";
            Query = Query.Replace("@@IdAlmacen", IdAlmacen);
            Query = Query.Replace("@@IdArticulo", IdArticulo);

            try
            {
                return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Cantidad"].ToString());
            }
            catch (Exception)
            {
                return 0;
            }
        }

        #endregion
    }
}
